<!DOCTYPE html>
<html lang="en">
  <head>
    
      <title>Mysql中的事务 :: Rennan Blog — We can exchange and study together</title>
    
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta name="description" content="MySQL事务的四大特性   原子性 原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚，因此事务的操作如果成功就必须要完全应用到数据库，如果操作失败则不能对数据库有任何影响。
  一致性 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态，也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说，假设用户A和用户B两者的钱加起来一共是5000，那么不管A和B之间如何转账，转几次账，事务结束后两个用户的钱相加起来应该还得是5000，这就是事务的一致性。
隔离性 隔离性是当多个用户并发访问数据库时，比如操作同一张表时，数据库为每一个用户开启的事务，不能被其他事务的操作所干扰，多个并发事务之间要相互隔离。  即要达到这么一种效果：对于任意两个并发的事务T1和T2，在事务T1看来，T2要么在T1开始之前就已经结束，要么在T1结束之后才开始，这样每个事务都感觉不到有其他事务在并发地执行。　持久性 持久性是指一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。  mysql隔离级别 MySQL InnoDB事务的隔离级别有四级，默认是“可重复读”（REPEATABLE READ）
  未提交读(READ UNCOMMITTED) 另一个事务修改了数据，但尚未提交，而本事务中的SELECT会读到这些未被提交的数据（脏读）(隔离级别最低，并发性能高)
  提交读(READ COMMITTED) 本事务读取到的是最新的数据(其他事务提交后的)。问题是，在同一个事务里，前后两次相同的SELECT会读到不同的结果(不重复读) 会出现不可重复读、幻读问题(锁定正在读取的行)
  可重复读(REPEATABLE READ) 在同一个事务里，SELECT的结果是事务开始时时间点的状态，因此，同样的SELECT操作读到的结果会是一致的 但是，会有幻读现象(稍后解释)。会出幻读(锁定所读取的所有行)
  串行化(SERIALIZABLE) 读操作会隐式获取共享锁，可以保证不同事务间的互斥(锁表)
  "/>
<meta name="keywords" content=""/>
<meta name="robots" content="noodp"/>
<link rel="canonical" href="/my_blog/post/mysqlwork/" />





<link rel="stylesheet" href="/my_blog/assets/style.css">


<link rel="stylesheet" href="/my_blog/style.css">


<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/my_blog/img/apple-touch-icon-144-precomposed.png">
<link rel="shortcut icon" href="/my_blog/img/favicon.png">


<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Mysql中的事务"/>
<meta name="twitter:description" content="Mysql中的事务"/>



<meta property="og:title" content="Mysql中的事务" />
<meta property="og:description" content="Mysql中的事务" />
<meta property="og:type" content="article" />
<meta property="og:url" content="/my_blog/post/mysqlwork/" />
<meta property="article:published_time" content="2018-06-21T00:00:00+00:00" />
<meta property="article:modified_time" content="2018-06-21T00:00:00+00:00" /><meta property="og:site_name" content="Rennan Blog" />






  </head>
  <body class="">
    <div class="container">
      <header class="header">
  <span class="header__inner">
    <a href="/my_blog/hello/" class="logo" style="text-decoration: none;">
  
    <span class="logo__mark"><svg xmlns="http://www.w3.org/2000/svg" class="greater-icon" viewBox="0 0 44 44">
  <path fill="none" d="M15 8l14.729 14.382L15 35.367"/>
</svg>
</span>
    <span class="logo__text">Welcome To MyBlog</span>
    <span class="logo__cursor"></span>
  
</a>

    <span class="header__right">
      
        <nav class="menu">
  <ul class="menu__inner menu__inner--desktop">
    
      
        
          <li><a href="/my_blog/resume">resume</a></li>
        
      
        
          <li><a href="/my_blog/vue">vue</a></li>
        
      
      
    
  </ul>

  <ul class="menu__inner menu__inner--mobile">
    
      
        <li><a href="/my_blog/resume">resume</a></li>
      
    
      
        <li><a href="/my_blog/vue">vue</a></li>
      
    
  </ul>
</nav>

        <span class="menu-trigger">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
            <path d="M0 0h24v24H0z" fill="none"/>
            <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
          </svg>
        </span>
      
      <span class="theme-toggle">
        <svg class="theme-toggler" width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
  <path d="M22 41C32.4934 41 41 32.4934 41 22C41 11.5066 32.4934 3 22
  3C11.5066 3 3 11.5066 3 22C3 32.4934 11.5066 41 22 41ZM7 22C7
  13.7157 13.7157 7 22 7V37C13.7157 37 7 30.2843 7 22Z"/>
</svg>

      </span>
    </span>
  </span>
</header>


      <div class="content">
        
  
  

  <div class="post">
    <h2 class="post-title"><a href="/my_blog/post/mysqlwork/">Mysql中的事务</a></h2>
    <div class="post-meta">
      
        <span class="post-date">
          21066-08-21
        </span>

        
          
        
      

      <span class="post-author">— Written by ren nan</span>
      
    </div>

    

    

    <div class="post-content">
      <h2 id="mysql事务的四大特性">MySQL事务的四大特性</h2>
<ol>
<li>
<p>原子性
原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚，因此事务的操作如果成功就必须要完全应用到数据库，如果操作失败则不能对数据库有任何影响。</p>
</li>
<li>
<p>一致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态，也就是说一个事务执行之前和执行之后都必须处于一致性状态。</p>
</li>
</ol>
<p>拿转账来说，假设用户A和用户B两者的钱加起来一共是5000，那么不管A和B之间如何转账，转几次账，事务结束后两个用户的钱相加起来应该还得是5000，这就是事务的一致性。</p>
<ol start="3">
<li>隔离性
隔离性是当多个用户并发访问数据库时，比如操作同一张表时，数据库为每一个用户开启的事务，不能被其他事务的操作所干扰，多个并发事务之间要相互隔离。</li>
</ol>
<p>即要达到这么一种效果：对于任意两个并发的事务T1和T2，在事务T1看来，T2要么在T1开始之前就已经结束，要么在T1结束之后才开始，这样每个事务都感觉不到有其他事务在并发地执行。　</p>
<ol start="4">
<li>持久性
持久性是指一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。</li>
</ol>
<h2 id="mysql隔离级别">mysql隔离级别</h2>
<p>MySQL InnoDB事务的隔离级别有四级，默认是“可重复读”（REPEATABLE READ）</p>
<ol>
<li>
<p>未提交读(READ UNCOMMITTED)
    另一个事务修改了数据，但尚未提交，而本事务中的SELECT会读到这些未被提交的数据（脏读）(隔离级别最低，并发性能高)</p>
</li>
<li>
<p>提交读(READ COMMITTED)
    本事务读取到的是最新的数据(其他事务提交后的)。问题是，在同一个事务里，前后两次相同的SELECT会读到不同的结果(不重复读)
    会出现不可重复读、幻读问题(锁定正在读取的行)</p>
</li>
<li>
<p>可重复读(REPEATABLE READ)
    在同一个事务里，SELECT的结果是事务开始时时间点的状态，因此，同样的SELECT操作读到的结果会是一致的
    但是，会有幻读现象(稍后解释)。会出幻读(锁定所读取的所有行)</p>
</li>
<li>
<p>串行化(SERIALIZABLE)
    读操作会隐式获取共享锁，可以保证不同事务间的互斥(锁表)</p>
</li>
</ol>

    </div>
    
      
        <div class="pagination">
          <div class="pagination__title">
            <span class="pagination__title-h">Read other posts</span>
            <hr />
          </div>
          <div class="pagination__buttons">
            
              <span class="button previous">
                <a href="/my_blog/post/2018-08-19/">
                  <span class="button__icon">←</span>
                  <span class="button__text">django使用sql原生语句</span>
                </a>
              </span>
            
            
              <span class="button next">
                <a href="/my_blog/post/mysqlsou/">
                  <span class="button__text">Mysql中的乐观锁和悲观锁</span>
                  <span class="button__icon">→</span>
                </a>
              </span>
            
          </div>
        </div>
      
    


    
      
        

      
    

    </div>

      </div>

      
        <footer class="footer">
  <div class="footer__inner">
    
      <a href="/my_blog/hello/" class="logo" style="text-decoration: none;">
  
    <span class="logo__mark"><svg xmlns="http://www.w3.org/2000/svg" class="greater-icon" viewBox="0 0 44 44">
  <path fill="none" d="M15 8l14.729 14.382L15 35.367"/>
</svg>
</span>
    <span class="logo__text">Welcome To MyBlog</span>
    <span class="logo__cursor"></span>
  
</a>

      <div class="copyright">
        <span>© 2020 Powered by <a href="https://gohugo.io" target="_blank" rel="noopener">Hugo</a></span>
        <span>Theme created by <a href="https://twitter.com/panr" target="_blank" rel="noopener">panr</a></span>
      </div>
    
  </div>
</footer>

<script src="/my_blog/assets/main.js"></script>
<script src="/my_blog/assets/prism.js"></script>


      
    </div>

    
  </body>
</html>
